package com.fy.proj3_deepseek_api.util;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class FileUtil {
    // 支持的文本文件类型
    public static final Set<String> SUPPORTED_TEXT_FILE_TYPES = new HashSet<>(Arrays.asList(
            "text/plain", "text/markdown", "text/html", "text/csv", "application/json", 
            "application/xml", "text/xml", "application/javascript", "text/css",
            "application/x-www-form-urlencoded"
    ));
    
    // 支持的文件扩展名
    public static final Set<String> SUPPORTED_EXTENSIONS = new HashSet<>(Arrays.asList(
            "txt", "md", "markdown", "html", "htm", "csv", "json", "xml", "js", "css"
    ));

    /**
     * 读取文本文件内容
     * @param file 上传的文本文件
     * @return 文件内容字符串
     * @throws IOException 当文件读取失败时抛出
     */
    public static String readTextFile(MultipartFile file) throws IOException {
        return new String(file.getBytes(), StandardCharsets.UTF_8);
    }

    /**
     * 检查文件是否为Markdown格式
     * @param file 要检查的文件
     * @return 如果是Markdown文件返回true，否则返回false
     */
    public static boolean isMarkdownFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return false;
        }
        
        // 检查文件类型
        String contentType = file.getContentType();
        if (contentType != null && contentType.equals("text/markdown")) {
            return true;
        }
        
        // 检查文件扩展名
        String originalFilename = file.getOriginalFilename();
        return originalFilename != null && 
               (originalFilename.toLowerCase().endsWith(".md") || 
                originalFilename.toLowerCase().endsWith(".markdown"));
    }

    /**
     * 检查文件是否为支持的文本文件类型
     * @param file 要检查的文件
     * @return 如果是支持的文本文件返回true，否则返回false
     */
    public static boolean isSupportedTextFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return false;
        }
        
        // 检查文件类型
        String contentType = file.getContentType();
        if (contentType != null && SUPPORTED_TEXT_FILE_TYPES.contains(contentType)) {
            return true;
        }
        
        // 检查文件扩展名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename != null) {
            int lastDotIndex = originalFilename.lastIndexOf('.');
            if (lastDotIndex > 0) {
                String extension = originalFilename.substring(lastDotIndex + 1).toLowerCase();
                return SUPPORTED_EXTENSIONS.contains(extension);
            }
        }
        
        return false;
    }

    /**
     * 获取文件扩展名
     * @param file 上传的文件
     * @return 文件扩展名（小写），如果无法获取则返回空字符串
     */
    public static String getFileExtension(MultipartFile file) {
        if (file == null || file.getOriginalFilename() == null) {
            return "";
        }
        
        String originalFilename = file.getOriginalFilename();
        int lastDotIndex = originalFilename.lastIndexOf('.');
        if (lastDotIndex > 0) {
            return originalFilename.substring(lastDotIndex + 1).toLowerCase();
        }
        
        return "";
    }

    /**
     * 生成安全的文件名（去除特殊字符）
     * @param originalFilename 原始文件名
     * @return 安全的文件名
     */
    public static String generateSafeFilename(String originalFilename) {
        if (originalFilename == null) {
            return "file";
        }
        // 去除文件名中的特殊字符，只保留字母、数字、点、下划线和连字符
        return originalFilename.replaceAll("[^a-zA-Z0-9._-]", "");
    }
    
    /**
     * 检查文件大小是否在允许范围内
     * @param file 上传的文件
     * @param maxSizeBytes 最大允许大小（字节）
     * @return 如果文件大小在允许范围内返回true，否则返回false
     */
    public static boolean isFileSizeAllowed(MultipartFile file, long maxSizeBytes) {
        return file != null && file.getSize() <= maxSizeBytes;
    }
}